home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / comm / fido / wpl_intro.lzh / wpl.readme < prev    next >
Text File  |  1993-02-24  |  78KB  |  1,699 lines

  1.  
  2.                Welmat Programming Language - WPL
  3.                ---------------------------------
  4.  
  5.   WPL is the new interpreted language for writing network mailers and
  6. other telecomunications utilities.  The language is designed to be very
  7. extendable by third party developers, and makes use of a grouping of
  8. shared libraries with a standardized interface.
  9.  
  10.   The 'application' previously called 'Welmat' and this language have
  11. a few things in common.  Firstly, the origional 'Welmat' code was used as a
  12. shell during the development of this language so that things could be
  13. upgraded in stages. At this point the majority of the code has been 
  14. re-written, and most of what used to be called 'WELMAT' is now housed in
  15. an XPR library called 'xprfts.library' that is an optional external
  16. transfer protocol.  Secondly, the development philosophy and distribution
  17. licence for the program called 'WELMAT' is being kept.  This new language
  18. is licenced under the GNU public licence and is aimed at providing very
  19. powerfull and configurable tools to allow the users to determine their
  20. own personal networking environments.   Thirdly, the name 'WELMAT'
  21. is being kept as the name of the support conference, it is the 'W' in 'WPL',
  22. and there is a hope that a 'WCompile' program to make use of the old 
  23. V0 Welmat config files will be written.  At last, many of the origional 
  24. Welmat enthusiests are getting involved with the development, beta testing 
  25. and support of this new language and related tools.
  26.  
  27.   The similarities between WPL and the application called WELMAT pretty much
  28. end there.  This new language is just that : A LANGUAGE.  With this language
  29. comes many different 'levels' of users ranging from people who would need
  30. to be 'C' and Assembly programmers, to people who might not even know how
  31. to run a CLI command:
  32.  
  33.   a) WPI (Welmat Programmers Interface) developers - People who would make 
  34. use of 'wpl.library' and other tools common to the WPL envirionment in 
  35. language extension libraries, etc [Note: Any of the old WELMAT
  36. programs that talked to the 'WelmatMAST' message port (wctl, WNotify, wabort, 
  37. etc), as well as any flow.library supporting utilities do not work in 
  38. conjunction with WPL.]
  39.  
  40.   b) WPL developers - People who write mailers, BBS's, terminal packages or
  41. other applications in the new WPL language.  These people could also be 
  42. the authors of programs such as WCompile, WelmatPrefs, etc which would in 
  43. one way or another generate a 'WPL script' that would contain the 
  44. functionality of the 'application'.  These developers might also include
  45. the various REXX and FPL developers who would be making use of the various
  46. language gateways to these telecomunications tools.
  47.  
  48.   c) While not really 'WPL specific', any author working on an XPR 
  49. supporting file transfer protocol, expecially those that are working on 
  50. libraries that might conform to the future 'XPR 3.0' proposals
  51. would be able to make use of WPL as their host, and any WPL developers would 
  52. be able to make use of these file transport protocols in their applications.
  53. Anyone interested in this level of development are strongly encouraged
  54. to get connected to the XPR mailing list for future XPR development
  55. discussion (More information provided in the 'XPR' section of this readme).
  56.  
  57.   d)  While again not 'WPL specific', any author working on xferq.library
  58. supporting file request handlers, tosser/scanners, outbound list
  59. managers, etc  would also be able to make use of WPL as their host.
  60. Regardless of whether an author wishes to use WPL itself, adding 
  61. support for XferQ is extremely highly reccomended as it will likely become
  62. the future standard in outbound queue management for the Amiga.
  63. [information available from David Jones (dej@qpoint.ocunix.on.ca)]
  64.  
  65.   e) User level - This would constitute the majority of people using WPL
  66. based systems.  These people would need no knowledge of any tools other
  67. than the programs that will be generating the 'WPL scripts' that will be
  68. their mailer.  People in this group could be using mailers that are
  69. configured much like the old Welmat V0 config files, or with newer systems
  70. such as the proposed WelmatPrefs program (A program that will make setting
  71. up a network mailer as simple as setting up ones screen preferences).
  72.  
  73.   *NOTE*:  WPL is an internal language that will likely be used by less than
  74. 10% of the users that will be making use of the new environment.  Unless you
  75. are an extreme power user, it is reccomended that you wait to do any mailer 
  76. beta testing until some of the configuration editors are being written.  
  77. Learing WPL,WPI,etc is not required, nor even reccomended for the majority 
  78. of users!!!
  79.  
  80.  
  81.   It is my hope that in the future the various 'user levels' will be able
  82. to have their own support people.  I myself would love to be able to 
  83. write networking tools that I would then support to people at the first
  84. and second level.   These people in turn would write 'user applications' that
  85. they would support to the actual users as they would be more familiar with
  86. configuration issues with their tools than anyone else.  This would allow
  87. for much more people to be involved, and for much better user support for
  88. all the various types of users that exist.   One of the problems, for instance,
  89. with the current 'WELMAT' support conference is that people at the
  90. 'User Level' are almost shut out by the people at the 'WPL developer'
  91. level.  For this reason I am in the process of setting up an alternate
  92. WPL-PROGRAMMER support conference so that another conference WPL-_APPLICATION
  93. will be left for 'User Level' support of the various applications that 
  94. will emerge.
  95.  
  96.  
  97.  
  98. --------------------------------------------------------------------------------
  99.   WPL Support
  100.   -----------
  101.  
  102.   Before moving into discussing how WPL itself works, I thought I should
  103. mention methods of asking questions.  I find that with a new language
  104. that there is a fairly high initial learning curve, but that things get
  105. easier once the initial problems are worked out.
  106.  
  107.   Since WPL is a mailer language that can be used by people in many different
  108. types of networks, support exists in many forms:
  109.  
  110. Fidonet  Email Support: Russell McOrmond@fidonet#1:1/139
  111. Internet Email Support: aa302@freenet.carleton.ca 
  112.  
  113. Old Fido support Echo :  WELMAT
  114.   Note:  The support conference for the old program 'WELMAT' is only
  115.          temporarily being used until the new support conferences can
  116.          be added to the backbone.  I wish to eventually vacate this
  117.          conference, and leave it available for people to actually
  118.          discuss the old 'Welmat' program.
  119.  
  120. Programmer support echo:  WPL-PROGRAMMER [yet to be added to backbone]
  121. Programmer support list:  wpl-programmer@alfred.ccs.carleton.ca
  122.   Requests to join the list: wpl-programmer-request@alfred.ccs.carleton.ca
  123.      This conference is aimed at the more technical aspects of the use of
  124.      WPL as a language, and as an expandable library system.  It is 
  125.      requested that support questions of users not developing in WPL,
  126.      C, assembly, ETC to put their questions into WPL-APPLICATION.
  127.  
  128. User support echo:  WPL-APPLICATION  [yet to be added to backbone]
  129. User support list:  wpl-application@alfred.ccs.carleton.ca
  130.   Requests to join the list: wpl-application-request@alfred.ccs.carleton.ca
  131.      This conference is aimed at the 'Users' of WPL based application scripts,
  132.      GUI configuration editors, and other such things.  This is an open forum
  133.      between the WPL developers and the users of their applications.
  134.      It is requested that this conference remain as non-technical as possible.
  135.  
  136.  
  137.   Various WPL representatives also frequent the Fidonet echomail
  138. conferences AMIGA_NET_DEV and AMY_POINT, as well as the usenet
  139. conferences comp.sys.amiga.datacomm and alt.sys.amiga.uucp
  140.  
  141. --------------------------------------------------------------------------------
  142.  
  143.   What is required to run WPL?
  144.   ----------------------------
  145.  
  146. Required:  Before attempting to set up WPL, the following should be located.
  147.   - WPL requires AmigaDOS 2.04 (Kickstart V37) or higher.
  148.   - The main binary for wpl (currently 'wpl.bin', soon wpl.library).
  149.     (Magic name only available in support conference currently)
  150.   - xferq.library (Now in public testing)
  151.   - xprzedzap, xprfts and any other XPR's you require for the protocols
  152.     you wish to run.
  153.   - A configuration program generator, or knowledge of WPL in order to 
  154.     write your own configuration script.
  155.  
  156. Optional:
  157.   - If you are using a Tosser/Scanner that uses 4-D .OUT files, JBundle
  158.     is reccomended for compression.
  159.   - If you are using a Tosser/Scanner that uses .FLO files, some sort of
  160.     'conversion' utility is needed.  One has not yet been written to my
  161.     knowledge.
  162.   - If you wish to support file requests, XFreqSH, or some XferQ supporting
  163.     file request handler is needed.
  164.   - If you wish to support UUCP, Login is reccomended.
  165.   - A nodelist 'lookup' program is required for nodelist support.  Support
  166.     programs for both traplist.library and IGEN's 'nodelist.library' exists.
  167.   - to write XferQ supporting scripts or programs, the full XferQ 
  168.     documentation is a must.
  169.   - To edit your outbound queue, XTool is currently reccomended.
  170.  
  171. --------------------------------------------------------------------------------
  172.  
  173.   General WPL script information
  174.   ------------------------------
  175.  
  176.   A WPL script is a text file that is read in line by line by a routine that 
  177. will try to analyse the line into a valid WPL statement.  When these lines 
  178. are parsed, they are parsed into a format of:
  179.  
  180. [label:] command [parameter] [parameter] [parameter] ...
  181.  
  182.  where the 'label' is a string of alpha-numerics a maximum of 30
  183. characters in length (and is terminated by a colon ':').  A command is
  184. any WPL command that is known to the parser at the time the file is being
  185. parsed, and the parameters are a given number of text strings where the
  186. number is specific to each WPL command.
  187.  
  188.   Before looking up the command it first checks if the first character
  189. is a ';' (semicolon) or a '#' (octothorp).  If it is, the rest of the
  190. line is 'thrown out' as being a comment.  (NOTE: If there was a label on
  191. the line before the comment, the label is valid).  A blank line, lines with
  192. comments, or parameters beyond the number required by the function are just
  193. thrown out as 'useless information' and are not kept by the WPL parser.
  194.  
  195.   Strings within WPL are a generic concept used by every function in the
  196. language. When I say a function takes '3 parameters' I mean that it takes three
  197. of these 'WPL strings'.
  198.  
  199.   Now, since the space character is used to separate parameters, if you want to
  200. send an actual 'space' character, you must put your string within quotes. Now
  201. that you're using the double quote " character to form the string, if you want
  202. to put an actual QUOTE character within a string, you must escape it by doing
  203. \"  (Yes, just like what was done in WCompile's config files). Now that you
  204. have this escape character, if you want to put a '\' in the string, you must
  205. escape the escape character and use \\.
  206.  
  207.   Some other special escape characters exist:
  208.  
  209.   \n   - Newline (Same as Linefeed)
  210.   \r   - Return character
  211.   \### - send the Octal (base 8) character given by the three digits following
  212. the slash.
  213.  
  214.  
  215.  Note: single-tic ' characters have absolutely not significance to WPL strings
  216. at all, and are added un-touched to the string.  As you know they DO have a
  217. significance to REXX so are usefull to avoid having to 'escape the quote' when
  218. sending messages to REXX.
  219.  
  220.   If a variable is being read as a boolean, it is considered true if it's
  221. 'numeric value' is not '0', or if the first character is upper or lower case
  222. 't'.  Otherwise, it is considered false.
  223.  
  224.   TRUE == -1 == 1 == truck == 9999
  225.   FALSE == 0 == Charles == false
  226.  
  227. ------------------------------------------------------------------------------
  228.  
  229.  
  230.   Here is a very general rundown of the commands currently available within
  231. WPL.  I will be trying to keep this updated and as accurate as possible, so 
  232. let me know about any incorrect, or un-clear commentary.  I will later on
  233. be basing the WPL programmers manual on this text.
  234.  
  235.   The format of this command list gives the following information:
  236.  
  237.   Command Name,  Number of argument STRINGS
  238.   - WPL variables read
  239.   - WPL variables modified
  240.   - General description of the command.
  241.  
  242. ------------------------------------------------------------------------------
  243.  
  244.   The first type of commands are the control commands.  These commands are
  245. only available from within a WPL script, and are not available via the REXX
  246. port.  These are also the only commands that do not follow the same rules for
  247. their parameters.  Unlike other commands, a variable is a hard-coded
  248. text value and cannot include any type of variable.  Also note that all labels
  249. are currently *case insensitive*.
  250.  
  251.   NOTE: If a label is not found, this statement will just continue with the
  252.         next statement.  A program called 'WLint' will detect and warn about
  253.         these types of things, but one should be carefull until that
  254.         program is written.
  255.  
  256.   Return         0
  257.   - No WPL variables read or modified
  258.     This command will return to whatever called the sub-routine.  If the
  259.     sub-routine was called by the 'SubJump' command, it will continue with
  260.     the statement following the 'SubJump'.  The last 'RETURN' statement
  261.     within a WPL script will cause the SLAVE to exit.
  262.  
  263.   TrueReturn     0
  264.   - Reads the $(RC) variable as a boolean.
  265.   - Does not modify any variables.
  266.     This will do a return only if the $(RC) variable is True.
  267.  
  268.   FalseReturn    0
  269.   - Reads the $(RC) variable as a boolean.
  270.   - Does not modify any variables.
  271.     This will do a return only if the $(RC) variable is False.
  272.  
  273.   Jump           1
  274.   - No WPL variables read or modified
  275.     This command will search for the given label and will unconditionally jump
  276.     to that location in the script.  No return address is saved.
  277.  
  278.   TrueJump       1
  279.   - Reads the $(RC) variable as a boolean.
  280.   - Does not modify any variables.
  281.     Will only jump if the $(RC) variable is True.
  282.  
  283.   FalseJump      1
  284.   - Reads the $(RC) variable as a boolean.
  285.   - Does not modify any variables.
  286.     Will only jump if the $(RC) variable is False.
  287.  
  288.   SubJump        1 
  289.   - No WPL variables read or modified
  290.     This command will search for the given label and will unconditionally jump
  291.     to that location in the script saving the return address.  When the next
  292.     'return' statement is hit, control will return to the statement
  293.     immediately following the SubJump command.
  294.  
  295.   TrueSubJump    1
  296.   - Reads the $(RC) variable as a boolean.
  297.   - Does not modify any variables.
  298.     Will do a SubJump call only if the $(RC) variable is True.
  299.  
  300.   FalseSubJump   1
  301.   - Reads the $(RC) variable as a boolean.
  302.   - Does not modify any variables.
  303.     Will do a SubJump call only if the $(RC) variable is False.
  304.  
  305. ----------------------------------------------------------------------------
  306.  
  307.   The following commands are both within a WPL script, and via the
  308. REXX port of a specific slave.  All parameters can be built up of fixed text
  309. and any type of variable.
  310.  
  311.   With the proposed new 'wplcmd.library' and 'wplext.library' function
  312. libraries, I am attempting to organize commands into one one of the two
  313. libraries.  The 'wplcmd.library' is the required library, and will house
  314. all the commands that are required for operation.  'wplext.library' will
  315. house any extension commands that might be usefull for WPL programmers,
  316. but who's usage in 'Config File Generators' will be discouraged in order to
  317. keep RAM requirements down.  Please let me know if you disagree with my
  318. organization.
  319.  
  320.   (*) - indicates a 'wplcmd.library' command
  321.   (+) - indicates a 'wplext.library' command
  322.   (-) - indicates a temporary command that might be removed.
  323.  
  324.  
  325. (*)AddResponse    PAIRS
  326.   - Does not read or modify any variables.
  327.     Takes a pair of parameters.  The first is an 'event' name, and the
  328.     second parameter is a pattern.  Three special cases exist:
  329.     a) The event is the word 'find'.  In this case the second parameter
  330.       is not a 'pattern', but is a string that contains a %d that will be
  331.       used to find the baud rate.  The matching is considered 'true' if the
  332.       number is found.  An example would be:
  333.       Addresponse FIND "CONNECT %d"
  334.       The event type as returned from GetResponse will actually be 'CONNECT',
  335.       and the baudrate is changed to the number grabbed with the %d.
  336.     b) The event is a number.  In this case the second parameter is a 
  337.       case insensitive AmigaDos wildcard.  If it matches the incoming
  338.       string, the event is set to 'CONNECT', and the baudrate is changed to
  339.       the given number.
  340.     c) The even it just text, in which case the second parameter is a
  341.       case insensitive AmigaDos wildcard.  If the wildcard matches, the
  342.       event is set to the value given by the first parameter.
  343.  
  344. (*)Address        2
  345.    - does not read any variables
  346.    - sets $(Result1), $(Result2), $(RC)
  347.    The first parameter is a CASE SENSITIVE AREXX port name, and the second
  348.    parameter is a command to be sent to that port.  The result from the
  349.    command is set into $(Result1).  If the result was 0 and a secondary
  350.    result was returned, it will be placed into $(Result2).
  351.    Return values in $(RC) are as follows:
  352.      0 - Message sent OK.
  353.     19 - Couldn't find Port.
  354.     20 - Memory for message couldn't be allocated.
  355.  
  356.  
  357. (*)CallForward    1
  358.   - does not read any variables.
  359.   - Sets $(RC) as a boolean.
  360.     This command will take a call found with the 'CheckCall' command and will
  361.     forward it to an alternate slave/message port.  The parameter given, if it
  362.     is a number, is taken to be the number of an active slave.  Otherwise, the
  363.     parameter is taken to be the REXX message port name of an active REXX
  364.     host.  If the port is found, the REXX message (Exactly as it was sent to
  365.     this slaves port) is forwarded to that port, the 'active call' pointer
  366.     used by 'ReportSesStat' is cleared, and the variable $(RC) is set to TRUE, 
  367.     otherwise $(RC) is set to FALSE (And the call is not cleared or forwarded).
  368.  
  369.     Note:  If one wishes to re-queue a call to be processed at a later time, one
  370.        would just forward it back to the same slave, eithor by REXX name or
  371.        by saying 'CallForward $(line)'.
  372.        Also note that the REXX port that this forwards the REXX message to
  373.        can be *ANY* valid AREXX port on the system, not just the WPL ones.
  374.        If one is running a mailer other that WPL, they could even forward
  375.        a call to this other program's REXX port.
  376.  
  377.  
  378. (*)CheckCall      0
  379.   - Does not read any variables.
  380.   - Sets the $(RC) variable as a boolean.  Also sets the stem variable 'remote'.
  381.     This command will check the call queue and will return the address
  382.     information of the call (in the stem variable 'remote') and set the $(RC)
  383.     to TRUE if a call exists.  If there are no pending calls, $(RC) will be
  384.     set to FALSE.
  385.     The stem variable 'remote' includes: remote.address , remote.network,
  386.          remote.domain,remote.zone, remote.net, remote.node, remote.point.
  387.     The remote.address is a full nDimensional address as specified by Xferq.
  388.     The remote.network is currently one of 'FIDO', 'UUCP', 'FQDA', 'TEXT' as
  389.     per XferQ.
  390.  
  391.  
  392. (*)CheckCarrier   0
  393.   - Does not read any variables.
  394.   - Sets the $(RC) variable as a boolean.
  395.     This command is used to check to see whether or not there is a carrier
  396.     present on a specific slave.
  397.  
  398. (+)Clear          NO LIMIT
  399.     Will remove a WPL style variable from the list of variables.  
  400.     This command is equivalant to 'set <var> ""'
  401.  
  402. (*)ClearResponse  0
  403.   - Does not read or modify any variables.
  404.     Will clear all the response strings for a slave.
  405.  
  406. (*)Cmp            2
  407.   - Does not read any variables.
  408.   - Will set the RC variable as a boolean.
  409.     This function does a case sensitive string compare on the two parameters.
  410.     The two parameters must match character by character (Spaces included) in
  411.     order to set RC to 'TRUE'.  
  412.  
  413. (*)CmpI           2
  414.   - Does not read any variables.
  415.   - Will set the RC variable as a boolean.
  416.     This function does a case INSENSITIVE string compare on the two parameters.
  417.     The two parameters must match character by character (Spaces included) in
  418.     order to set RC to 'TRUE'.
  419.  
  420. (*)Connected      1
  421.   - Does not read or set any variables
  422.     Takes as it's parameter a network address and will set up the
  423.     'outbound list' from xferq.library for that site.  In the future it will
  424.     take any number of parameters, each one being an AKA address to send the
  425.     files for (an XferQ feature).
  426.  
  427. (*)Delay          1
  428.   - does not read any variables.
  429.   - Sets the $(RC) as a boolean.
  430.     This is a low overhead command that will wait for the amount of seconds
  431.     given in the parameter.  It is intended for short delays during 
  432.     negotiation, and should not be used for extended timeouts.  Use
  433.     WaitEvent or GetResponse instead.
  434.  
  435. (*)FindFreq       1
  436.   - Reads $(outbund) 
  437.   - Sets the return code $(RC) as a boolean
  438.     Takes an address as the parameter and will look for 2-D or 4-D request
  439.     files in the outbound directory.  If found, it will add them to the
  440.     outbound list and will return $(RC) as true.
  441.  
  442. (-)FlushLog       0
  443.   - reads $(LogPort)
  444.   - does not modify any variables.
  445.     flushes current log via LogProc (Rexx port "$(LogPort)")
  446.     Equivalant to:
  447.        Address "$(LogPort)" "FlushLog"
  448.  
  449. (*)GetInbound     1
  450.    - Reads: $(TryWazoo) , $(tryFts1)
  451.      'SayHello' reads WPL variables: host.wzdomain, host.sitename, host.sysop, 
  452.       host.zone, host.net, host.node, host.point, remote.password, host.wzcap,
  453.       freq
  454.    - wpl variables set: remote.zone, remote.net, remote.node, remote.point,
  455.      remote.wzdomain, remote.domain, remote.password, remote.address,
  456.      remote.wzcap, host.wzcap (Modified to chosen protocol),
  457.      remote.sitename, remote.sysop, remote.product, remote.product_maj,
  458.      remote.product_min, EVENT, FTS1, WAZOO
  459.    Gets inbound (Someone called in) negotiation (Login, FTS1, YooHoo, etc)
  460.    Value given as parameter is the timeout in seconds.
  461.  
  462.    $(EVENT) has the following values:
  463.      "FTS1" - TSYNCH received - $(FTS1)==TRUE, $(WAZOO)==FALSE
  464.      "GOTYOOHOO" - Hello greeting received OK.
  465.          wpl variables set: remote.zone, remote.net, remote.node, remote.point,
  466.              remote.wzdomain, remote.domain, remote.password, remote.address,
  467.              remote.wzcap, host.wzcap (Modified to chosen protocol),
  468.              remote.sitename, remote.sysop, remote.product, remote.product_maj,
  469.              remote.product_min
  470.      "EMSI"      - "**EMSI_" string received - Full line of text in $(namebuf)
  471.      "LOGIN"     - Line of text in $(namebuf).  If $(namebuf)=="bbs" then
  472.                    <esc> may have been hit twice.
  473.      "CARRIER"   - Carrier Dropped.
  474.      "TIMEOUT"   - A timeout occured.
  475.  
  476.     
  477. (*)GetOutbound    0
  478.    - Reads: $(TRYWAZOO)
  479.      'SayHello' reads WPL variables: host.wzdomain, host.sitename, host.sysop, 
  480.       host.zone, host.net, host.node, host.point, remote.password, host.wzcap,
  481.       freq
  482.    - wpl variables set: remote.zone, remote.net, remote.node, remote.point,
  483.      remote.wzdomain, remote.domain, remote.password, remote.address,
  484.      remote.wzcap, host.wzcap (Modified to chosen protocol),
  485.      remote.sitename, remote.sysop, remote.product, remote.product_maj,
  486.      remote.product_min, EVENT,  FTS1, WAZOO
  487.  
  488.  
  489.    Gets outbound (We called out) negotiation (Login, FTS1, YooHoo, etc)
  490.  
  491.    $(EVENT) has the following values:
  492.      "NOANSWER" - No return character came back from the <space> <return>
  493.                   stage of negotiation
  494.      "NOCLEAR"  - Line didn't clear after banner.
  495.      "CARRIER"  - Carrier Dropped.
  496.      "FTS1"     - Two Consecutive 'C' or <NAK> characters received, indicating
  497.                   FTS1 transfer desired. $(WAZOO)==FALSE, $(FTS1)==TRUE
  498.      "NOSYNCH"  - Timeout before any negotiation successfull.
  499.      "NOHELLO"  - Remote didn't acknowledge our Hello Message.
  500.      "NOYOOHOO" - Remote didn't send their Hello.
  501.      "BADYOOHOO"- Recieved YooHoo was bad.
  502.      "WAZOO"    - YooHoo properly received. $(WAZOO)==TRUE, $(FTS1)==FALSE
  503.  
  504.     During a YooHoo sequence our "Hello" is sent.  At that point the equvalant of
  505.     the 'WazooRespond' is executed.  Then their Hello is received, and the
  506.     variables indicated in GetInbound for YooHoo are then set.
  507.  
  508. (*)GetResponse    1
  509.   - does not read any variables.
  510.   - Will set the variables $(LastResponse), $(Event) and possibly
  511.     set $(BAUD) (If $(event) was CONNECT).
  512.  
  513.     This command makes use of the Response strings set up with the
  514.     'AddResponse' command.  Will wait for a maximum of seconds given by the
  515.     argument for a line of text (Which is then placed in $(LastResponse).
  516.     The text is checked against the response strings and if a match
  517.     is made, then $(EVENT) is set to the EVENT part of the response pair,
  518.     otherwise $(EVENT) is cleared to "", or it's set to one of the internal
  519.     events (Listed below).
  520.  
  521.     $(EVENT)
  522.       NOMODEM    - MOpen was not done before this command - it exited 
  523.                    immediately
  524.       OWNDEVUNIT - Someone else wants the device
  525.       TIMEOUT    - A timeout occured
  526.       CARRIER    - Carrier 'dropped' during command
  527.       CONNECT    - From Response ### or response find
  528.  
  529. (*)Launch         3
  530.    - reads $(stack), $(priority) 
  531.    - sets $(RC)
  532.  
  533.    launches a slave where the three parameters are
  534.    1) Line Number - Number > 0
  535.    2) Slave name - This is a string (Max 100 chars) that is used as the
  536.       REXX port name, and the CLI name for the process.
  537.    3) Label to start execution at.
  538.  
  539.    The new slave is executed with the stack and priority indicated
  540.    in $(STACK) and $(PRIORITY).  The return codes set in $(RC) are
  541.    as follows:
  542.  
  543.      0 - All OK so far.
  544.      1 - Can't create public port.
  545.      2 - Can't open timer.
  546.      3 - Can't allocate vars structure.
  547.      4 - Can't open xferq.library
  548.     99 - No memory in slave.
  549.    101 - No memory for structure.
  550.    102 - Error in new process launching.
  551.  
  552. (*)ModemClear     0
  553.   - does not read any variables.
  554.   - Sets the $(RC) as a boolean.
  555.     This command will clear both the inbound and outbound serial buffers.
  556.     Will set $(RC) to FALSE if this line did not have it's modem opened,
  557.     otherwise it will be true.
  558.  
  559. (*)ModemClose     0
  560.    - Does not read or modify any variables
  561.      Closes modem previouly opened with ModemOpen
  562.  
  563. (+)ModemInit      0
  564.   - Reads $(BaudLocked), $(InitWait), $(InitLoop), $(HangupString)
  565.     , $(initString), $(Atten), $(Prompt)
  566.   - Sets $(Baud) to the same value as $(BaudLocked). Sets the $(RC) variable 
  567.     as a boolean.
  568.  
  569.     This command goes into a loop that looks like the following:
  570.  
  571.       while I've looped less than $(initloop) times
  572.         Is there a carrier?
  573.           Send The $(HangupString) string
  574.         othewise, Have we gotten an 'OK' from the modem last loop?  If not
  575.           Send The $(Atten) string
  576.         otherwise
  577.           Send the $(InitString)
  578.  
  579.         Wait for a maximum of $(InitWait) seconds for the $(Prompt) to come
  580.         back from the modem.
  581.       if we still have a carrier, or didn't get the $(Prompt), then loop.
  582.  
  583.  
  584.     The boolean $(RC) is set to FALSE if a carrier still exists after the system
  585.     tries to initialize the modem, otherwise it is set to TRUE.
  586.  
  587. (*)ModemOpen      0
  588.    - Reads: unit, device, serflags, baudlocked
  589.    - sets RC as a boolean
  590.      Will open a modem on this slave using the settings in the above variables.
  591.      Will automatically close an old modem that may have been opened previously.
  592.  
  593. (*)Pattern        2
  594.   - Does not read any variables.
  595.   - Will set the RC variable as a boolean.
  596.     This function does a case insensitive amigados style pattern match on
  597.     the two strings.  The first string is the source string, and the second
  598.     string is the AmigaDos pattern.
  599.     Examples:
  600.        Pattern "This iS a TesT"  "this ???a test"   
  601.           returns TRUE
  602.        Pattern "this ???a test" "This iS a TesT"
  603.           returns FALSE
  604.        Pattern "This iS a TesT "  "this ???a test"   
  605.           returns FALSE
  606.        Pattern $(some_Variable) "#(1|3|5|7|9)"
  607.           returns TRUE if the WPL variable some_variable is composed totally of
  608.           a string of odd numbers.
  609.        Pattern $(remfile) "#?.REQ"
  610.           returns TRUE if the WPL variable remfile has a string that ends in
  611.           the letters '.req' (Such as an incoming file request!)
  612.  
  613. (*)Print          1
  614.   - Does not read or modify any variabes.
  615.     This command will print the given parameter to the slaves active status
  616.     console as set by 'SetStatus'.
  617.  
  618. (+)PutLog         1
  619.   - Does not modify any variabes.
  620.   - reads $(CurrentLog), $(LogPort) variable
  621.     sends text to current log via LogProc (REXX port "$(LogPort)").
  622.     Equivalant to:
  623.        Address "$(LogPort)" "PutLog $(CurrentLog) <text>"
  624.  
  625. (*)ReportSesStat  1
  626.   - does not read or modify any variables.
  627.     Takes a numeric return code, and returns it as the status of the
  628.     current call.
  629.  
  630. (*)Send           1
  631.    - does not read or modify any variables
  632.      sends an un-interpreted string out the current modem.
  633.  
  634. (*)Set            PAIRS
  635.     Sets local WPL style variables.  Pairs of 'variable' 'value' are
  636.     accepted.
  637.  
  638. (*)SetA            2
  639.   - Does not read any variables.
  640.   - Sets the given stem variable.
  641.     This command accepts a 'stem variable' as the first parameter, and an
  642.     address string as the second.
  643.  
  644.    eg: seta remote 1:163/109
  645.  
  646.     Would set the same variables as CheckCall would if someone did a 
  647.     'call 1:163/109'
  648.  
  649.     The stem variable includes: <stem>.address , <stem>.network,
  650.          <stem>.domain, <stem>.zone, <stem>.net, <stem>.node, <stem>.point.
  651.     The <stem>.address is a full nDimensional address as specified by Xferq.
  652.     The <stem>.network is currently one of 'FIDO', 'UUCP', 'FQDA', 'TEXT' as
  653.     per XferQ.
  654.  
  655.  
  656. (+)SetBaud        1
  657.   - does not read any variables.
  658.   - Sets $(Baud) and $(BaudLocked) to the value of the given parameter.  Will
  659.     also set the $(RC) variable as a boolean.
  660.     This command will set the baud variables, and then attempt to change the
  661.     device's baud rate.  Will set $(RC) to FALSE if this line did not have 
  662.     it's modem opened, otherwise it will be true.
  663.  
  664. (*)SetEnv         PAIRS
  665.     Allows one to set a global ENV: variable.  Pairs of 'variable' 'value' are
  666.     accepted
  667.  
  668. (*)SetMailerFlags 1
  669.   - does not read or modify any WPL variables.
  670.  
  671.     Changes the General mailer flags for this slave. Options not specified here
  672.     will be left un-changed.  Please do not ever rely on the system 'defaults'
  673.     for these values.
  674.  
  675.     Flag     Value               Meaning
  676.  
  677.       D        Y        Generate and send a Dummy poll packet.
  678.       D        N        Do not generate or send a Dummy poll packet.
  679.       D        E        Generate and send a Dummy poll packet only if no other
  680.                         files are to be sent. 
  681.       P        Y        Assume the first file received should be a .PKT and
  682.                         generate a unique packet name. (Not yet implemented)
  683.       P        N        Leave the filename of the first file as the remote
  684.                         indicated it's name should be.
  685.  
  686.      Example:  For FTS-1 sessions, one would use:
  687.        SetMailerFlags "DY,PY"
  688.  
  689. (*)SetPri         1
  690.   - Does not read or modify any variables.
  691.     Will set the priority of a slave to the given value. For further
  692.     information on this command, please refer to the AmigaDos 
  693.     shell command 'ChangeTaskPri'.
  694.  
  695. (*)SetStatus      1
  696.    - does not read or modify any variables
  697.     Will set the standard out of a slave to a given file specification.
  698.     Many different error messages and runtime status information (As well
  699.     as the output of the 'PRINT' WPL command) go to this file handle.
  700.     Usually specifies a RAW:
  701.  
  702. (+)SetUpdate      1
  703.    - does not read or modify any variables
  704.      Takes a parameter that can be one of three types:
  705.      "SetUpdate NULL"   - Turns this feature off (default)
  706.      "SetUpdate status" - Use the existing status window (Not reccomended)
  707.      "SetUpdate <filename>" - Use the given filename (RAW: usually) for the
  708.                          XPR transfer status window.
  709.  
  710. (*)SignalSlave    PAIRS
  711.    - does not read or modify any variables
  712.      Given a slave number it will send the given signals to the slave.
  713.      The signals are as follows:
  714.        "c" - BREAKC
  715.        "d" - BREAKD
  716.        "e" - BREAKE
  717.        "f" - BREAKF
  718.        "m" - Message Port Signal
  719.      
  720.      Signals are most often sent to a slave in order to 'wake it up' to check
  721.      other variables/etc.
  722.  
  723. (*)SmartSend      1
  724.    - reads $(SlowModem)
  725.    - does not modify any variables
  726.      Sends interpreted modem string to the serial port.  The interpreted
  727.      characters are as follows (Note: one would preceed these characters
  728.      with the '\' excape character if the special character needed to be
  729.      sent out the modem):
  730.        ^ - Raise DTR.  See $(DTR_CONTROL)
  731.        v - Lower DTR.  See $(DTR_CONTROL)
  732.        ~ - Wait 250ms.
  733.        ` - Wait 62.5ms.
  734.        | - Send a return character.
  735.      If the variable $(SlowModem) is TRUE, a 62.5ms delay will be placed
  736.      between each character sent.
  737.  
  738. (*)System         1
  739.   - Reads the WPL variables: stack, ShowSystem
  740.   - Sets the variable RC with the return code of the AmigaDos command.
  741.     The WPL variable 'stack' is used to change the default stack (taken from
  742.     the stack size of the slave itself).  If the variable 'ShowSystem' is
  743.     TRUE, the full 'execute' command is dumped to the status console.
  744.     The command takes an AmigaDos function as the parameter and will
  745.     synchronously execute the command.
  746.  
  747. (*)XprClose       0
  748.    - does not read any variables
  749.    - modifies $(RC)
  750.      Ends session with XPR library and free's associated resources.
  751.      The XProtocolCleanup() function is called, and any files left in
  752.      the XPR transfer list are marked as having 'failed'.  Any
  753.      outbound management at end of session is handled.
  754.      The variable $(RC) is set to false if the modem was not given,
  755.      otherwise it is true.
  756.  
  757. (*)XprReceive     1
  758.    - does not read any variables
  759.    - sets $(RC)
  760.      Receive single file (Specify name - Not yet supported)
  761.      Receive batch files to $(inbound) (Specify "")
  762.      This function will call the XPR receive function.  During a transfer
  763.      various WPL subroutines such as $(PostInbound), $(PreInbound),
  764.      $(PostOutbound), $(PreOutbound) could be called.  See "XPR Interface"
  765.      section of the manual for more details.
  766.  
  767. (*)XprSend        1
  768.    - does not read any variables
  769.    - sets $(RC)
  770.      Send single file (Specify name - not yet supported)
  771.      Send batch files from list in outbound manager. (Specify "")
  772.      This function will call the XPR send function.  During a transfer
  773.      various WPL subroutines such as $(PostInbound), $(PreInbound),
  774.      $(PostOutbound), $(PreOutbound) could be called.  See "XPR Interface"
  775.      section of the manual for more details.
  776.  
  777. (*)XprSetup       2
  778.    - does not read anyvariables
  779.    - sets $(RC), $(XprSetup)
  780.  
  781.    Sets up an XPR library ready for a transfer.  The first parameter
  782.    given is the xpr library name, and the second parameter is a string
  783.    passed to the xpr library with  XProtocolSetup().  The variable
  784.    $(XprSetup) is set to the numeric return of XProtocolSetup(). A value
  785.    of 0 indicates a failure, otherwise the setup was successful.  Since
  786.    only one library can be opened at any one time, any previous libraries
  787.    are first closed.
  788.  
  789.    Return values in $(RC) are as follows:
  790.       0 - All OK.
  791.       1 - XProtocolSetup returned FALSE.
  792.       2 - Library not able to be opened
  793.       3 - Out of memory.
  794.       4 - Wasn't given required modem.
  795.       
  796.  
  797. (-)WaitEvent      1
  798.    - does not read any variables
  799.    - modifies $(BREAKT), $(BREAKC), $(BREAKD), $(BREAKE), $(BREAKF)
  800.    The given parameter is a timeout in seconds.  This command waits for any
  801.    of the 4 signals and sets the appropriate boolean variable to 'true'.
  802.    $(BREAKT) indicates that a timer event occured.  During the wait the
  803.    slave will process messages on it's REXX port.
  804.  
  805. (*)WazooRespond   0
  806.   - Reads WPL variables host.wzdomain, host.sitename, host.sysop, host.zone, 
  807.     host.net, host.node, host.point, remote.password, host.wzcap, freq
  808.   - Sets $(event)
  809.  
  810.     Used after a GetInbound to respond to the remotes hello packet with one of
  811.     your own.  Will read the listed variables to properly set the YooHoo hello.
  812.  
  813.     Possible values set to $(event) are:
  814.     "CARRIER"  - Carrier dropped.
  815.     "NOYOOHOO" - Required response character not found.
  816.     "2U2"      - Success - Hello response sent.
  817.     "TIMEOUT"  - A timeout occured.
  818.  
  819. ---------------------------------------------------------------------------------
  820.  
  821.   These commands exist for debugging/etc and are known to be being removed in the
  822. future
  823.  
  824. (-)-ListResp      0
  825.   - Does not read or modify any WPL variables.
  826.     Lists modem responses to console (from AddResponse).
  827.  
  828. (-)-ListVars      0
  829.   - Doesn't change any variable.
  830.   - Will list out all the active variables in a particular slave to the
  831.      slaves console.
  832.  
  833. (-)-ListConfig      0
  834.   - Doesn't change any variable.
  835.     Lists out the current 'memory' version of the config file to
  836.     standard out.
  837.  
  838. (-)-Debug      1
  839.   - Doesn't change any variable.
  840.     Outputs string to debug console via KPrintF() function (Sushi used to
  841.     redirect).
  842.  
  843. -------------------------------------------------------------------------------
  844.   The following commands are available exclusively from the REXX port.
  845.  
  846.   ABORT 0
  847.     This message, sent to a specific slaves message port, is intended to
  848.     abort a specific slave.  The REXX message will wait until the slave has
  849.     exited before it will return.   A WPL developer would check for the
  850.     existance of an ABORT rexx message via the $<abort> calculated variable.
  851.  
  852.   CALL 1
  853.     This message, sent to a specific slaves message port, takes an address 
  854.     (Of any currently understood network type) and will add it to the list of 
  855.     sites that a specific slave will attempt to dial.  This message will be 
  856.     replied to via the 'ReportSesStat' WPL which sets it's return code.
  857.     Please see the  documentation of the WPL instructions 'CheckCall', 
  858.     'CallForward' and 'ReportSesStat' for further information.
  859.  
  860.   STRING 1
  861.     This message, sent to the specific slaves message port, is used to make use
  862.     of the internal STRING generating routines.  This message will return a
  863.     message in RESULT (Make sure you have REXX set up with 'options results')
  864.     which is the string created by sending the supplied parameter through the
  865.     internal STRING handler.  Any $(), ${}, $<> style variable substitution is
  866.     available via this method and is a clean way to get information back from
  867.     WPL.
  868.     (Note: as an example, call.rexx makes use of this to check the status of a 
  869.     specific slave)
  870.  
  871.  
  872. ----------------------------------------------------------------------------
  873.  
  874.   In order to facilitate standard features in all 'setups' of WPL, certain
  875. constructs are being strongly suggested to include.  While these are optional,
  876. they will make interfacing with external programs written for use with WPL
  877. much more transparant.
  878.  
  879.   One of the issues relates to the use of the $(STATE) variable.  Since Robert
  880. has been playing with this longer, I'll just add his latest thoughts:
  881.  
  882. From: Robert Williamson on 1:167/104.0
  883. Date: Friday, 25-Sep-92 22:38  (29-Sep-92)
  884.  
  885. The WPL variable $(STATE) should be set to one of the following values.  The
  886. values are case insensitive:
  887.  
  888.     WAITING     Waiting for commands/waiting for ring/etc
  889.     DIALING     CheckCall to event CONNECT
  890.     ANSWERING   event RING to event CONNECT
  891.     SESSION     inbound or outbound session
  892.     EXTERNAL    system/rexx/login/bbs
  893.     BUSY        anything else
  894.     EXITING     obvious
  895.  
  896.  When reading $(state), the user should be aware that a string is returned, and
  897. in some implemeations only the first word of this string is one of the above. 
  898. For example,in arexx, if doing a comparision, to be safe, one should :
  899.   if upper(word(RESULT,1)) = "DIALING" then do ....whatever
  900.  
  901.  At present the Roof implemeation returns the following extensions:
  902.  DIALING $(remote.address)
  903.  SESSION [$(remote.address)|"unknown"] [INBOUND|OUTBOUND]
  904.  SESSION unknown FTS1
  905.  SESSION [BBS|LOGIN] $(username)
  906.  
  907.  I'm setting BUSY from waitring:  to just after setglobals in waitring1: where
  908. I set WAITING. In other words, modem stuff.
  909.  
  910.   I set ANSWERING at my own answer: label (entry point for answer when NO DIAL
  911. TONE on dial), just before sending answer string.
  912.  
  913.  For EXTERNAL, I save and restore the previous state.
  914.  
  915.  I've added an addtional in the Slave Startup, "LAUNCHING $(line)"
  916.  
  917.   I'm still refining this and may remove or add stuff. :)
  918.  
  919.  
  920. ----------------------------------------------------------------------------
  921. Read-only Calculated variables: $<variable>
  922.  
  923.   There are a type of variable used in WPL strings that are known as
  924. calculated variables.  These variables are variables who's values are
  925. 'evaluated' at the time that the value is asked for.  Currently, the
  926. calculated variables are as follows:
  927.  
  928.   $<date>   - substitutes the date in dd-mm-yy format.  This will be 
  929.               localized at a future point.
  930.  
  931.   $<time>   - substitutes the current time in hh:mm:ss format.  This will 
  932.               be localized at a future point.
  933.  
  934.   $<abort>  - Counts the number of REXX abort messages awaiting WPL to
  935.               exit.  This is used as a boolean that when true ( > 0) will
  936.               signify that a WPL script should attempt to exit.  These
  937.               messages will be replied to only once the last slave has closed.
  938.  
  939.   $<slaves> - Counts the number of active slaves at any given point.
  940.  
  941. ----------------------------------------------------------------------------
  942.  
  943. XPR Interface:
  944.  
  945.   During an XPR transfer, various WPL subroutines could possibly be called.
  946. These WPL subroutines are figured out at the time when XprSetup is called,
  947. and the variables should not be changed during an XPR transfer.  They are
  948. subroutines, and thus one must do a RETURN to return control back to the
  949. XPR.  It is intended for simple 'display' purposes and no large amount of
  950. logic should be done in these subroutines.
  951.  
  952. *UNDER NO CIRCUMSTANCES SHOULD ONE OPEN OR CLOSE AN XPR DURING THESE SUBROUTINES*
  953.  
  954. The subroutine variable names are as follows:
  955.  
  956.   $(PreInbound)  - Called first time an Inbound file is opened.
  957.                    $(RemFile) - Filename as given by remote
  958.                    $(TempFile) - full pathname to temporary inbound name.
  959.                    $(FileSize) - The file size (from protocol, 0 if not known yet)
  960.  
  961.   $(PreOutBound) - Called first time an Outbound file is opened.
  962.                    $(RemFile) - Filename as given by remote
  963.                    $(LocalFile) - full pathname to local file.
  964.                    $(FileSize) - The file size (from disk).
  965.                    
  966.   $(PreFullName) - Called first time a 'FullName' file is opened.
  967.                    $(RemFile) - Filename as given by remote
  968.                    $(LocalFile) - full pathname to local file.
  969.                    $(FileSize) - The file size (from disk).
  970.                    
  971.   $(PostInbound) - Called after an Inbound files status is known.
  972.                    $(FileStatus)=="Received","Failed"
  973.                    $(RemFile) - Filename as given by remote
  974.                    $(TempFile) - full pathname to temporary inbound name.
  975.                    $(InFile) - Full pathname to final name (After rename if
  976.                      successfull transfer)
  977.                    $(FileSize) - The file size (from protocol)
  978.                    $(CPS) - Characters per second rating.
  979.                    $(CPSP) - Characters per second rating (Percentage)
  980.  
  981.   $(PostOutbound) - Called after an outbound files status is known
  982.                    $(FileStatus)=="Sent","Deleted","Truncated","Failed"
  983.                    $(RemFile) - Filename as given to remote (asname)
  984.                    $(localFile) - full pathname to local file.
  985.                    $(FileSize) - The file size (from disk)
  986.                    $(CPS) - Characters per second rating.
  987.                    $(CPSP) - Characters per second rating (Percentage)
  988.  
  989.   $(PostFullName) - Called after a 'FullName' transfer status is known
  990.                    $(FileStatus)=="Sent","Deleted","Truncated","Failed"
  991.                    $(RemFile) - Filename as given to remote (asname)
  992.                    $(localFile) - full pathname to local file.
  993.                    $(FileSize) - The file size (from disk)
  994.                    $(CPS) - Characters per second rating.
  995.                    $(CPSP) - Characters per second rating (Percentage)
  996.  
  997.  
  998. Mailing List:
  999.   There is ongoing work with group in mailing list towards a possible XPR 3.0 
  1000. specification.  Some full bi-directional transfer will be worked on.
  1001.  
  1002.     To join the list, send an Email to:
  1003.       xpr-request@aldhfn.akron.oh.us    with "subscribe user@site" as the body
  1004.     
  1005.      For posts to the list:
  1006.        xpr@aldhfn.akron.oh.us
  1007.  
  1008.  
  1009. ----------------------------------------------------------------------------
  1010.  
  1011.   Support Utilities
  1012.   -----------------
  1013.  
  1014.   The latest versions of these utilities will be file requestable from
  1015. the WPL support site, and the list is available via the magic name 'WPL'.
  1016.  
  1017.  
  1018.   JBundle  - The latest release of JBundle (Jbun2.rexx) now makes use
  1019.       of XferQ to manage the outbound list.  This script will take 4
  1020.       dimensional zone.net.node.point.OUT files generated by many mailers
  1021.       and do all the required manipulations to compress and add the files
  1022.       to XferQ in a very multi-tasking friendly way.
  1023.  
  1024.   JTick - A grouping of REXX scripts and AmigaDos binaries to handle
  1025.       file echo distribution, file posting, and other related functions.
  1026.       Makes use of XferQ for outbound lists.
  1027.  
  1028.   Login - A program that allows Welmat/WPL to act as a 'getty'.  Login takes 
  1029.       a user name, and will prompt for a users password.  If the password
  1030.       matches it will run the given command.  Reads a password file very
  1031.       similar to a unix PASSWD file (Similar to the AmigaUUCP GETTY command).
  1032.  
  1033.   LogProc - a REXX message port host that handles multiple logging sessions.
  1034.       Currently used as logging system for many WPL based mailers.
  1035.  
  1036.   Lookup - A nodelist.library [Igen - a recompile is required for traplist
  1037.       support] based utility that will do a nodelist lookup and stick the
  1038.       results in environment variables in a form used by many WPL scripts.
  1039.  
  1040.   ROOF - Robert Williamson has written many usefull scripts including
  1041.       a full mailer in WPL, a 'download without having to log into the BBS',
  1042.       a WLint program to check WPL programs for correctness, a master files
  1043.       list program, and many more.  The file ROOF_WPL.lha is in the WPL
  1044.       support files area, and is updated weekly.  More up-to-date versions
  1045.       are available directly from it's author.
  1046.  
  1047.   xferq.library  - WPL has now completely moved over to XferQ support,
  1048.       including all address handling.  The 'seta', 'call' and 'connected'
  1049.       functions can accept any address type that XferQ itself can handle.
  1050.       WPL programmers should probably file request the complete XferQ
  1051.       documentation so that they can make use of the library and AREXX
  1052.       interfaces to this shared library in their software.
  1053.  
  1054.   XFreqSH - This is a replacement for the old WNotify program [which does not
  1055.       work with WPL any more] for use with XferQ based mailers.  Source has 
  1056.       been released to the public domain in the hopes that better file 
  1057.       request handlers can be written, and that XferQ support will be added 
  1058.       to the already existing file request handlers.
  1059.  
  1060.   XTool  - This utility allows one to do the bare minimum queue maintenance
  1061.       with XferQ.  It does replace most of the functionality of what FloAdd,
  1062.       FloEdit and FloList did for flow.library.
  1063.  
  1064.   xprclock.library  - A sample library used to get set the Amiga's clock from
  1065.       an atomic clock such as the one ran by the NRC in Ottawa, Canada.
  1066.       Sources are released as a simple example to people wanting to write
  1067.       XPR libraries for non file-transfer usage.
  1068.  
  1069.   xprfts.library - Now documented in the separate archive, I am still looking
  1070.       for a volunteer to take over the development of this library while I
  1071.       take care of other things.  The XPR Update handling is basically
  1072.       non-existant, and the display looks extremely poor during an FTS1 or
  1073.       DietIFNA session.
  1074.  
  1075.   xprzedzap.library - Yves is the current 'Keeper of Sources' to this library
  1076.       that is becoming very robust.  The latest version I have seen was
  1077.       sent out as zzbin100.lha into ADSCOMM.
  1078.  
  1079.  
  1080. ----------------------------------------------------------------------------
  1081.   WPL Internals  (For information purposes only)
  1082.   -------------
  1083.  
  1084.   While there will be direct user access to many of the internals of WPL
  1085. via a WPL Programmers Interface (WPI for short), this interface has not yet
  1086. been standardized.  In order to give potential developers an idea of the
  1087. direction that we are headed, I will give a bit of documentation here.
  1088.  
  1089.   To start, one must first understand what happens when WPL loads a script
  1090. into memory.  While the language is an interpreted language like AREXX, 
  1091. unlike AREXX each command and parameters are tokenized as it is loaded
  1092. so that the running of the script will be faster.  The script is loaded,
  1093. line by line, and analysed according to this very basic layout:
  1094.  
  1095.   [label:] WPL_Command [parameter1] [parameter2]
  1096.  
  1097.   It then first checks if the first character of the WPL_Command is a
  1098. semicolon, and if this is the case the entire line (except the possible label)
  1099. is thrown out.
  1100.  
  1101.   Labels are attached to the next valid WPL Command, so the following are
  1102. equivalant:
  1103.  
  1104.   ; Comment
  1105.   label: WPL_Command
  1106.  
  1107.   label: ; Comment
  1108.   WPL_Command
  1109.  
  1110.   label:
  1111.   ; Comment
  1112.   WPL_Command
  1113.  
  1114.  
  1115.   The tokenizer will next look up the WPL Command in an internal list of
  1116. commands to try to figure out it's 'token number'.  An instruction token
  1117. is just a simple unique 32-bit number.  This number is specific to the 
  1118. revison of WPL currently running, and is also dependant on any WPL
  1119. language extension libraries that might be attached to wpl.library.
  1120.  
  1121.   Once the token is found, attached with the token is a number that
  1122. corresponds to the number of parameters that are required by the
  1123. specific command.  The specified number of parameters are accepted from
  1124. the command line, and added into the instruction list element.  One should
  1125. note that extra parameters are just ignored, and not included in the parsed
  1126. memory version of the instruction.
  1127.  
  1128.   Two special 'parameter numbers' exist, one to signify an unlimited number
  1129. of parameters being accepted, and another to indicate that an unlimited
  1130. number of parameter pairs are accepted.
  1131.  
  1132.  
  1133.   For those versed in the language 'C', the current internal instruction
  1134. structure looks like the following:
  1135.  
  1136. struct wProgNode {
  1137.   struct Node wp_Node;   /* ln_Name points to label if exists, or NULL */
  1138.   unsigned long wp_Size; /* entire size of this structure for free'ing purposes */
  1139.   unsigned long wp_Inst; /* instruction number - language revision specific */
  1140.   struct wProgNode *wp_Goto; /* address of possible label */
  1141.   char wp_Args[2];       /* start of memory for arguments/label */
  1142. };
  1143.  
  1144.   In the public structure when WPI is documented, the 'struct wProgNode *wp_Goto'
  1145. will become 'void *wp_Data', and will be private to the instruction
  1146. implementer.  In the above, the wp_Goto is used to store a 'label' location
  1147. the first time a *JUMP instruction is executed.  The next time it hits the
  1148. JUMP instruction, the command runs considerably faster.
  1149.  
  1150.  
  1151.   The 'char wp_Args[2]' will become 'char *wp_Args[]' and will be
  1152. an array of 'pointers' to the character strings.  The last element in the
  1153. array will be a NULL pointer that will signify the end of the parameters.
  1154. Currently a blank parameter is being used to signify the last parameter,
  1155. and this causes major problems if one wants to pass the null string ("") as
  1156. one of the parameters to an instruction.  Currently funky magic
  1157. comparing a pointer with (instruction+instruction->wp_Size) is being done,
  1158. which is IMO not an appropriate way to handle things.
  1159.  
  1160.  
  1161.   Now, when an instruction is executed, the wp_Inst is used as an
  1162. array index into a table of instructions, and from this table a pointer to
  1163. the actual function is found.  The generic prototype for an instruction is:
  1164.  
  1165. void wi_Instruction(struct wProgNode *thisNode,slave *mySlave);
  1166.  
  1167.   All parameters are then extracted directly from the instruction 
  1168. structure.  As an example, the simplest instruction in WPL would
  1169. be the 'print' instruction, and it's code is as follows:
  1170.  
  1171.  
  1172. void wi_Print(struct wProgNode *thisNode,slave *thisSlave)
  1173. {
  1174.   WGetString(thisNode->wp_Args,thisSlave->scratch,SCRATCHLEN,thisSlave);
  1175.   PutStr(thisSlave->scratch);
  1176. }
  1177.  
  1178.   Asside:  If anyone ever wants to know the specifics of how an instruction
  1179. is implemented, please just ask and I will send them the code for that
  1180. instruction.
  1181.  
  1182. Note: 'slave *' is a general pointer to a structure who's internal
  1183. composition is not available to a WPL instruction.  It is a 'cookie value'
  1184. that is passed to most WPI interface functions.
  1185.  
  1186.   Inside of a function, it is allowed only to access other parts of WPL
  1187. through the WPI interface.  An exception to this would be the 'built in'
  1188. instructions such as the *JUMP commands which have intimate knowledge of
  1189. the internals of WPL beyond the definition of a wProgNode, and the interface
  1190. functions defined with wpl.library.
  1191.  
  1192.   Here is a list of ideas.  I will likely not complete all of these before
  1193. making a preliminary release, and all documentation on these will be
  1194. subject to change as the need arises until the first 'totally public'
  1195. release (At which time anything that is documented will have to be cast
  1196. in stone!).  I will be expanding this documentation as time permits to
  1197. express current design ideas.
  1198.  
  1199.   - Command ideas:
  1200.   Group-I: - XPR defined calls.  These calls will have exactly the same
  1201.       structure as the XPR callback functions, except that they are accessed
  1202.       as library calls, and the additional parameter of 'slave *' is also
  1203.       passed.  One should note that the XPR callbacks within WPL are just
  1204.       simple assembly stubs that in one way or another will obtain this
  1205.       slave pointer.  These functions are defined and expanded as XPR is 
  1206.       expanded.  See the XPR documentation for more information.
  1207.     wpi_fopen()       Open inbound/outbound file
  1208.     wpi_fclose()      Close file
  1209.     wpi_fread()       Get string from file
  1210.     wpi_fwrite()      Put string to file
  1211.     wpi_sread()       Get string from serial
  1212.     wpi_swrite()      Put string to serial
  1213.     wpi_sflush()      Flush serial input buffer
  1214.     wpi_update()      Update file transfer status
  1215.     wpi_chkabort()    Check for abort
  1216.     wpi_chkmisc()     Check misc. stuff
  1217.     wpi_setserial()   Set and Get serial info
  1218.     wpi_ffirst()      Find first file name for batch transfers
  1219.     wpi_fnext()       Find next file name
  1220.     wpi_finfo()       Return file info
  1221.     wpi_fseek()       Seek in a file
  1222.     wpi_unlink()      Delete a file
  1223.     wpi_squery()      Query serial device
  1224.     wpi_getptr()      Get various host ptrs
  1225.  
  1226.     Future XPR defined functions that may be implemented.
  1227.       
  1228.     wpi_gets()        Get string interactively 
  1229.     wpi_options()     Better GUI based option requesting.
  1230.  
  1231.   Group-II - Variable control
  1232.  
  1233.     wpi_getstring()  Get WPI variable replacement string.
  1234.     wpi_setvar()     Set a variable to a null terminated string value.
  1235.     wpi_getvarnum()  Returns a long integer value from a variable.
  1236.     wpi_setvarnum()  Set a variable to a given long integer.
  1237.     wpi_getvarbool() Returns boolean value of variable.
  1238.     wpi_setvarbool() Sets a boolean variable. (Strings "TRUE":"FALSE")
  1239.  
  1240.  
  1241.   Group-III - WPI control
  1242.  
  1243.     wpi_findslave()   Returns a 32-bit value defining the slave
  1244.                       - Number given is slave number, or NULL - NULL will
  1245.                         find the slave who's process we are currently
  1246.                         running within (For libraries).
  1247.     wpi_controlTags() Generic interface to various internal controls.
  1248.                       The interface to allow the adding of various transfer 
  1249.                       status GUI handlers, Handlers for additional REXX based 
  1250.                       commands,  WPL language extensions and other related
  1251.                       functions will be supported.
  1252.  
  1253.     wpi_docmd()       Executes a single WPL command.
  1254.     wpi_execscript()  Runs a WPL script in the current context - Must be
  1255.                       a 'Slave' context executed from within a WPL 
  1256.                       extension library.
  1257.     wpi_launch()      Launches a new Slave.
  1258.     wpi_loadscript()  Loads in a WPL script ready to be executed 
  1259.                       (Multi-file scripting support)
  1260.  
  1261.  
  1262. ----------------------------------------------------------------------------
  1263.  
  1264.  Bug Reports
  1265.  -----------
  1266.  
  1267.   WPL is in many ways a series of atomic commands that can be put
  1268. together via a configuration script.  When filing a bug report, please
  1269. break the report down to it's smallest componants.  For most reports,
  1270. the problem can be broken down to being a single WPL command. A bug report
  1271. where you list your entire configuration file and say "It doesn't run" is
  1272. likely going to be met with silence as it's not all that usefull of
  1273. a report.
  1274.  
  1275.   As an example, if a problem is with a boolean *JUMP command, what one 
  1276. should report is the exact value of the $(RC) and the type of *JUMP 
  1277. command used.  Please verify that the target label can be found by
  1278. replacing the *JUMP by a non-boolean JUMP instruction, and check if
  1279. the branch is taken in this situation. For 'label' based problems, the 
  1280. output of the -ListConfig command is very helpfull.  I would expect the output
  1281. of this command in a bug report, and not a duplicate of your text configuration.
  1282. What -ListConfig will do is output the 'already parsed' memory copy of the 
  1283. configuration file. My sample configuration file does this for you.
  1284.  
  1285.   Also note that for a problem to be fixed, I have to be able to duplicate
  1286. it on my own machine.  If I can not duplicate it, it is impossible for
  1287. me to even begin to look into the problem, so please give as clear and
  1288. consise a report as possible so that I can find a way to duplicate the
  1289. problem.
  1290.  
  1291.  
  1292.   - Null Labels (A ':' on a blank line) was reported to crash the machine.
  1293.     (Unverified - I could not duplicate the problem)
  1294.  
  1295.   - xprfts.library transfers have an un-reliable startup for file sends - line
  1296.     noise can cause the transfer to be aborted. (Verified)
  1297.  
  1298.   - Robert reports odd problems with the boolean *JUMP commands. (Unverified)
  1299.  
  1300.   - Odd "Can't open file" when inbound $(inbound) changed just before
  1301.     zedzap transfer. [Yves mentioned it might relate to attempts to send
  1302.     '0 length files', ulthough I don't see how that relates to the changing
  1303.     of the $(INBOUND) directory as that would only be relevant to inbound
  1304.     (write) files]  (Unverified)
  1305.  
  1306.   - System crashes while loading for the first time.
  1307.     I'd like to have people do more testing on this as I'd like to get this
  1308.     one fixed before moving WPL into wpl.library. (Unverified)
  1309.  
  1310.   - Some part of the passing mechenism of information between AREXX and WPL
  1311.     is limited to '50 characters'.  I need much more information to go on
  1312.     before this can be looked into.
  1313.  
  1314.   - Very likely there are memory problems with LogProc.  Problems where two
  1315.     'abort' messages must be sent to LogProc exist.  The program was written a
  1316.     long time ago, and no large amount of debugging has been done.  If anyone
  1317.     has some time, and is very familiar with EXEC lists, please let me
  1318.     know.
  1319.     - Bug where one has to do an 'abort' request twice before the logging
  1320.       system actually aborts (Verified).
  1321.  
  1322.  TODO LIST
  1323.  ---------
  1324.  
  1325.   Here are some ideas that will be worked on towards V1.  This list is not
  1326. complete, and I would appreciate people listing anything that I have not
  1327. included in this list.  Some issues may not get dealt with before the 
  1328. release of Version 1 but will be dealt with in later versions.
  1329.  
  1330.   I have only started to set up an order to this list.
  1331.  
  1332.  
  1333.   - 'SetMailerflags PY' is listed as not yet implemented.
  1334.   - Document XPR issues (Security, level of expansion above XPR 2.0, 
  1335.       compatability)
  1336.     - specifically mention 'unknown' filenames, and their default to
  1337.       being 'inbound' files in the $(INBOUND) directory.
  1338.     - Path names are always stripped from the XPR's idea of the filename.
  1339.   - XprSetFile - Allows a pathname/asname/type mapping to be user
  1340.     configured so that one could do their own resume handling, or sending
  1341.     of a file with a different name to the remote site without adding
  1342.     to the outbound handler.  Used to indicate full pathname of single file
  1343.     sends.
  1344.  
  1345.      XprSetFile <Full Path Name> <Remote/AsName> <File Type>
  1346.  
  1347.      Where file Type is any of:
  1348.        o - Outbound file.
  1349.        d - delete file after sending.
  1350.        t - truncate file after sending.
  1351.        i - inbound file.
  1352.  
  1353.  
  1354.     Eg:  XprSetup xpftext.library ""
  1355.          XprSetFile work:text/TheWarOfTheWorlds.txt twotw.txt o
  1356.          XprSend twotw.txt
  1357.          XprClose
  1358.  
  1359.   - Address list handling - Most functions that take an 'address' as a
  1360.     parameter will be updated to take an address list.  For the purpose of
  1361.     the 'stem.ZONE', 'stem.NET', etc the first FTN address in the list will
  1362.     be used if an FTN address exists at all.
  1363.  
  1364.   - Clean things up so that all addressing defaults are taken from the
  1365.     defaults in Xferq (Currently Xferq:hostaddr) rather than being
  1366.     hard coded (ef: Wazoo domain 'fIdOnEt')
  1367.  
  1368.   - All methods to launch a slave, including the WPL 'Launch' Command updated 
  1369.     to be the same syntax as the C and REXX counterparts.
  1370.     
  1371.     Launch PortName Slave# StartLabel Priority Stack
  1372.  
  1373.   - wpl.library - The main slave handing parts of WPL will be moved into
  1374.     a shared library.  This will allow for external access to some of
  1375.     WPL's internal functions in a standardized method.  Launching/Exiting
  1376.     slaves, WPL variables, slave serial/io, and many other things will be
  1377.     accessable through this library.  Many functions will be accessable to
  1378.     the AREXX user through this library as well.
  1379.  
  1380.  
  1381.      *NOTE*  The main binary 'WPL.bin' will no longer exist.  One would
  1382.      launch WPL scripts via the wpl_launch() function (Which will be accessable
  1383.      via AREXX).
  1384.  
  1385.      pseudo-C for 'WPL.bin' emulation:
  1386.  
  1387.      main(int argc,char **argv)
  1388.      {
  1389.        char scratch[128],*script;
  1390.        long ret;
  1391.        Library *WPLBase;
  1392.  
  1393.        if(!(WPLBase=OpenLibrary("wpl.library",0)) {
  1394.          printf("Couldn't open WPL - exiting\n");
  1395.          exit(200);
  1396.        } 
  1397.  
  1398.        if (argc>1) {
  1399.           script=argv[1];
  1400.        } else if(GevVar("WELMAT",scratch,128,0)>0) {
  1401.          script=scratch;
  1402.        } else {
  1403.          script="welmat.lng"
  1404.        }
  1405.  
  1406.        if(ret=wpi_loadscript("main",script)) {
  1407.          /*             script name, filename  */
  1408.          printf("Script loading error: %ld",ret);
  1409.        } else if(ret=wpi_launch("SUPERSLAVE",666,"MAIN!STARTUP",0,30000)) {
  1410.          /*                       Name,number,"script!label",priority,stack */
  1411.          printf("Slave Launch failed return code %ld",ret);
  1412.        } else
  1413.          printf("WPL slave launched");
  1414.        CloseLibrary(WPLBase);
  1415.        exit(ret);
  1416.      }
  1417.       
  1418.   - Multi-file WPL programs for easier writing.  As indicated in the above,
  1419.     I am thinking of having labels expanded such that the 'script name' can
  1420.     be specified with any *jump command.  The '!' symbol would be used to
  1421.     separate the script name and the label.
  1422.  
  1423.     EG:
  1424.  
  1425.     wpl script name: main
  1426.  
  1427.            ...
  1428.            SubJump thispart
  1429.            TrueSubJump mybbs!startup
  1430.            ...
  1431.  
  1432.            thispart:
  1433.            cmpi $(username) "BBS"
  1434.            return
  1435.  
  1436.     wpl script name: mybbs
  1437.  
  1438.            startup:
  1439.            send "Welcome to my WPL based BBS"
  1440.            ...
  1441.    
  1442.   - Asynch SYSTEM command so that REXX messages can be received while
  1443.     a command is executing.
  1444.  
  1445.   - GetInbound/GetOutbound commads updated to understand the **EMSI_INQ and
  1446.     **EMSI_REQ negotiation sequences.  New $(EVENT) sequences will be:
  1447.  
  1448.        EMSI_REQ - A proper EMSI_REQ was received.  Remotely called site is
  1449.                   EMSI capable.
  1450.  
  1451.        EMSI_INQ - A proper EMSI_INQ was received. Calling system is EMSI
  1452.                   capable.
  1453.  
  1454.        EMSI_BAD - An unknown or bad EMSI sequence was received.  Full line
  1455.                   of text starting with **EMSI_ stored in $(namebuf) for
  1456.                   possible additional processing.
  1457.  
  1458.     New boolean variables read:
  1459.       GetFTS1 - Scan for double 'C' or double <NAK> in GetOutbound,
  1460.                 Scan for TSYNCH character in GetInbound.
  1461.       DoFTS1  - Send TSYNCH character in GetOutbound.
  1462.                
  1463.       GetFTS6 - Scan for ENQ in GetOutbound, Scan for YOOHOO character in
  1464.                 GetInbound.
  1465.       DoFTS6  - Send YOOHOO character in GetOutbound
  1466.  
  1467.       GetEMSI - Scan for any EMSI Sequences in both GetInbound/GetOutbound.
  1468.       DoEMSI  - Send an EMSI_INQ during GetOutbound as part of negotiation.
  1469.                 May cause negotiation problems with non EMSI sites and should
  1470.                 not be required.
  1471.  
  1472.     More complete EMSI Supported with the addition of a 'SendEMSI' and 
  1473.     'GetEMSI' functions:
  1474.  
  1475.     - SendEMSI will take the EMSI sequence name (EG: "IRQ") as it's parameter.
  1476.       Different EMSI sequences will read different WPL variables depending on
  1477.       the sequence.
  1478.  
  1479.     - GetEMSI will take a timeout.  $(EVENT) will be set to the received 
  1480.       EMSI sequence.  Various variables will be set depending on the EMSI
  1481.       sequence received.
  1482.  
  1483.     Here are the origional notes on EMSI that describes some of the issues:
  1484.  
  1485.     Before the final release of WPL V1, a fully extendable handshaking
  1486.     method will be implemented that will allow for full n-dimentional
  1487.     addressing, allow for non-fidonet addresses, unlimited AKA's, and unlimited
  1488.     support for user definable protocols.  Since I only wish to add a single 
  1489.     handshake, I do not wish to add a new handkshake unless it totally suits
  1490.     the needs of WPL.  While the current EMSI specification has most of
  1491.     what would be required, a few limitations still exist:
  1492.  
  1493.       a)  The concept of an 'address' is not clearly specified within the
  1494.         handshake.  While it makes reference to FTS-0001 for an out-dated
  1495.         4-D format for a fidonet address, it does not state a fully 5-D
  1496.         fidonet address, or state that one should 'skip' any addresses that
  1497.         are not understood.  (An 'address' can be thought of as a stream of
  1498.         characters separated by spaces, and terminated by an non-escaped
  1499.         '}' character).
  1500.    [ADDENDUM:  The fidonet format of zone:net/node.point@domain is being
  1501.     documented as the standard for EMSI.  Further documentation on
  1502.     non-fidonet addresses such as 'atronx.ocunix.on.ca' are also going to
  1503.     be mentioned]
  1504.  
  1505.       b) Zmodem has been named the 'minimum protocol'.  Since 'Fidonet'
  1506.         policy already dictates that all sites within the 'Fidonet' nodelist
  1507.         must already handle the FTS-1 protocol, I'm not going to add yet another
  1508.         'requirement' to WPL users.  WPL users should be able to pick
  1509.         and choose the protocols that best suit their networking environment,
  1510.         and in many cases Zmodem is a poor choice (Expecially outside of a
  1511.         nodelisted environment where one should only be required to keep online
  1512.         a small group of common protocols).  Regardless of one's opinions on 
  1513.         Zmodem (Or any other protocol for that matter), it should
  1514.         still be left up to the users to make that decision.
  1515.      [A kludge called 'SLK' to support SeaLink has been added. While this
  1516.       adds an additional protocol to the list being supported, it does not
  1517.       address the origional issue at all.  I am going to just ignore this
  1518.       and document my use of a flag to indicate DietIFNA]
  1519.        
  1520.        c) Related to the second issue is the fact that EMSI doesn't define
  1521.         a method to 'fall back' to an alternate handshake if EMSI fails.  
  1522.         Since both FTS-1 and FTS-6 (YooHoo) allow for protocols that are not
  1523.         yet shown in an EMSI handshake, there are sites where one would call
  1524.         where an EMSI handshake would fail, but an FTS-6 (Or even FTS-1)
  1525.         handshake would be successfull.  Unless a REQUIREMENT of EMSI is
  1526.         that all protocols that a program supports be shown in the EMSI
  1527.         handshake, then a method to fall-back to an alternate handshake 
  1528.         protocol is required.   Personally, the better solution would be to
  1529.         require all transmission protocols to be shown, but there are those 
  1530.         that argue against this possibility.
  1531.    [While a fallback method is being documented, JoHo (author of FrontDoor)
  1532.     has already stated that he does not plan to support it in the next
  1533.     release of FrontDoor.  Again, this oversight on JoHo's part is just
  1534.     going to be ignored]
  1535.  
  1536.       The EMSC group is currently discussing an update to the FSC-0056/EMSC-001
  1537.     document that will address these issues.  It's unfortunate that the
  1538.     EMSC group does not see the EMSI handshake as being the independant
  1539.     handshake that it could have become and placed these limitations on it,
  1540.     but I think that 'common practise' can outweigh the limitations.  I
  1541.     will be documenting a list of protocols and 3 letter EMSI ID's to
  1542.     use for all the available XPR protocols.  I will also be constantly
  1543.     sending an updated list to the EMSC group and into the NET_DEV
  1544.     conference and I think that one by one the various authors will
  1545.     start to support these various protocols regardless of what the EMSC
  1546.     group tries to limit the EMSI protocol to.
  1547.  
  1548.   - Finish up the XPR interface and set up some of the new XPR 3.0 ideas.
  1549.     Asynchronous File i/o (xpr_fwrite(),xpr_fread()) need to be written to
  1550.     increase transmission speeds.  Double-buffered xpr_swrite() call will also
  1551.     be set up.
  1552.  
  1553.  
  1554.  
  1555.  ** Document and release WPL V1.0 (Privately unless some WPL 'applications' 
  1556.     are available at this time), a preliminary 'WPL developers Package' from 
  1557.     which various applications can be written.
  1558.  
  1559.  
  1560.  
  1561.  
  1562.  
  1563.   - WPI interface - Many third party function libraries will be made
  1564.     possible by a standard method of adding commands to the WPL language via
  1565.     routines provided by wpl.library (See wpi_addfunclib()).  The main 
  1566.     library itself will only contain commands that cannot be made external, 
  1567.     and all other commands in a WPL extension library.
  1568.     - WPL internal tokenizer updated so that internal parameter passing is 
  1569.       changed from a stream of null terminated strings to a NULL 
  1570.       terminated array of strings.
  1571.  
  1572.   - WPL <-> FPL interfacing library.  A new language that has all the
  1573.     looping, boolean conditions and other such constructs has been written and
  1574.     made available in the form of a library.  I will be attempting to write an
  1575.     interface library (See wpi_getfunclist()) so that people could write 
  1576.     their mailers in a more full functioned language such as FPL (All WPL 
  1577.     commands except the 'control' constructs such as labels and *JUMP commands 
  1578.     will be available, much like the current AREXX interface - The speed of 
  1579.     WPL will likely be considerably faster than AREXX).
  1580.  
  1581.   - Expunge handling in wpl.library in such a way that the WPL system
  1582.     will minimize memory usage when WPL is not actually in use.  This will
  1583.     be very usefull to BBS operators in low-memory situations.
  1584.  
  1585.   - File resume handling using some sort of standard filenote format.  If other
  1586.     formats are desired by a WPL developer, the XprSetFile command would be
  1587.     used to manipulate with any other format.
  1588.  
  1589.   - A WLint to verify correctness of WPL programs, and to aid in writing.
  1590.     Checks for the existance of labels, accessability of labels, syntax of
  1591.     commands (Number of arguments, etc).  A simple REXX script has been
  1592.     written by James Atwill as a beginning called wpllc.rexx.
  1593.  
  1594.   - WCompile/WConfig for a config file similar to the Welmat V0 config file. This 
  1595.     will be for the 'middle' type users.  WConfig would allow the
  1596.     reading/writing of V0 config files, but have a GUI for ease of configuration.
  1597.       
  1598.   - WPLPrefs for use by point operators.  This will be totally point and
  1599.     click with a minimum amount of information required from the user in order
  1600.     to configure and run WPL.  This will set up an 'icon' that a user would
  1601.     just double click on in order to call their bossnode  (More than one Icon
  1602.     will likely be required for more than one bossnode).
  1603.  
  1604.   NOTE: It is my hope that WCompile/WConfig/WPLPrefs/etc/etc will be
  1605.       written by separate groups from myself.  I would rather spend my time
  1606.       on lower level tool development and have the 'application level'
  1607.       programs written by different authors.
  1608.  
  1609.   - xprfts.library - Needs to be fully debugged and updated to use the
  1610.     XPR Update screen.  This could easily be done by a third party author
  1611.     as all souces for this library are released.  If anyone has some time,
  1612.     please let me know!
  1613.  
  1614.   - xprscript.library - A full (And faster than implementing within WPL) scripting
  1615.     language.  Please send suggestions (Or even complete lists of requested
  1616.     scripting commands) to myself.  If there is a 'most popular' scripting
  1617.     language (VLT maybe?) that the author of the origional would not mind me
  1618.     implementing, I might go for that.  The basic 'Send/Expect' as used in
  1619.     UUCP will of course be implemted as a subset of the commands.
  1620.     (P.S.  Jason Trimble has donated a 'Style Guide' to the WPL project, and
  1621.      I have been told that the beginnings of a scripting language is 
  1622.      documented in there.  This will likely be the starting point for the
  1623.      scripting language).
  1624.  
  1625.   - OwnDevUnit - When ModemOpen cannot open a modem because someone else
  1626.     has it locked, it will be possible to run a WPL function that will
  1627.     be given the text of who has the device locked.  If this function returns
  1628.     with $(RC) set to TRUE, then ModemOpen will wait, otherwise it will
  1629.     abort ModemOpen with a failure.
  1630.  
  1631.   - ReportSesStat expanded to be able to set the rm_Result1 (Usually called RC
  1632.     in a REXX script) as well as rm_Result2 (Usually called RESULT in
  1633.     a REXX script).  It currently only sets rm_Result1.
  1634.  
  1635.   - Allow a ctrl-C in a slaves status window to abort an XPR transfer.
  1636.  
  1637.   - Deal with standardizing the use of the standard CTRL_C, CTRL_D, CTRL_E,
  1638.     and CTRL_F signals throughout all of the WPL commands.
  1639.  
  1640.   - Cliplist reading within WPL variables.  While I know how to set variables,
  1641.     I'm not at the moment sure how to read them.  This idea may be scratched.
  1642.  
  1643.   - A full xprfts7.library with full resume, SLO, etc
  1644.  
  1645.   - Expand variable sub-system to allow for deleting of entire stem variables
  1646.     with a single command.
  1647.  
  1648.   - IdentARing, Caller-ID and full voicemail support for use with
  1649.     the ZyXEL U-1496 modems.  CallerID is already in use in some WPL
  1650.     scripts.
  1651.  
  1652.   - IEMSI terminal specification for use with WPL based BBS's (And 
  1653.     possibly others as well, depending on external support).  This could 
  1654.     build into a full auto-login, fully graphical BBS Users interface 
  1655.     with background file transfers/etc/etc.
  1656.  
  1657.  
  1658.  
  1659. Issues:
  1660.   - Calculated Jumps - Jumps that involve a variable name within the parameter.
  1661.     - advantages    - Allows for 'self modifying' code
  1662.     - disadvantages - Allows for 'self modifying' code (Sorry, I had to say it)
  1663.                     - slows down as *JUMP commands usually make use of a
  1664.                       label location cache that is not possible with
  1665.                       labels that can change.
  1666.                     - Adds more complication to scripts with no way to
  1667.                       do a 'lint' that would verify the validity of
  1668.                       scripts before runtime - More runtime errors.
  1669.  
  1670.   - AbortAll - I believe that any WPL script that launches slaves should
  1671.     keep a list of these slaves, and if someone requests that they be
  1672.     Aborted, that the WPL script do it itself (Via the 'address' command).
  1673.     I do not want an AbortAll command to ever be implemented as this would
  1674.     mean that one 'slave' could arbitrarily kill off slaves that might have
  1675.     absolutely nothing to do with handling of modems, or with the WPL
  1676.     script that seems to want to abort things.
  1677.  
  1678.   - Distribution - Should the WPL development documentation be distributed
  1679.     with an 'application', or should the two be kept separate.
  1680.     I myself would love to get to the point when I am just supporting
  1681.     the WPL developers, and these developers are supporting their own
  1682.     applications.  Is this possible?  In this case the WPL development
  1683.     distribution could contain some 'examples', but this package would not be
  1684.     what is sent out to the 'public'.  It also would avoid some of the
  1685.     'multiple version' issues if a WPL developer released the specific
  1686.     version of WPL and support utilities required to run their application.
  1687.  
  1688.   - Support conferences - I am currently trying to set up a separate
  1689.     'WPL_APPLICATION' support conference to replace 'WELMAT' which is 
  1690.     currently on the backbone.  I would like to move the developer support
  1691.     (The majority of what is currently happening in the 'WELMAT' conference)
  1692.     into a separate conference, WPL_DEVELOPMENT.  How open this conference 
  1693.     will be (Private, Backbone, Gated to Usenet?) is up for discussion.  
  1694.     Whether or not 'heavy techie' will be allowed in the 'WPL_APPLICATON' 
  1695.     conference, and whether a new moderator will be named is also up for 
  1696.     discusion.  Again, I think the WPL_APPLICATION are should be moderated
  1697.     by someone other than myself.
  1698.  
  1699.